//
// Created by LiuYou on 2021/5/13.
//

/*
 * 操作:
 *      splice() 注意: 执行后就转移了, 之前的内容没有了, 已经转移到了新位置。
 *      unique()
 *      sort()
 *      merge() 注意: 执行后就转移了, 之前的内容没有了, 已经转移到了新位置。
 *      reverse()
 */
#include <list>
#include <iostream>
#include "Todo.hpp"

typedef std::list<Todo> ListTodo;
using ListTODO = std::list<Todo>;

int main() {
    std::list<Todo> todoThings;
    std::cout << "todoThings.size(): " << todoThings.size() << std::endl;
    std::cout << "todoThings.empty(): " << todoThings.empty() << std::endl;

    Todo todo1("1", "1");
    Todo todo2("2", "2");
    Todo todo3("3", "3");
    Todo todo4("4", "4");
    Todo todo5("5", "5");
    todoThings.push_back(todo1);
    todoThings.push_back(todo2);
    todoThings.push_back(todo3);
    todoThings.push_back(todo4);
    for (const auto& item : todoThings) {
        std::cout << item << std::endl;
    }
    std::cout << std::endl;

    // 使用splice()对同一个list进行操作, 交换两个相邻位置。
    todoThings.splice(++todoThings.cbegin(), todoThings, ++ ++todoThings.cbegin());
    for (const auto& item : todoThings) {
        std::cout << item << std::endl;
    }
    std::cout << std::endl;
    todoThings.splice(++todoThings.cbegin(), todoThings, ++ ++todoThings.cbegin(), todoThings.cend());
    for (const auto& item : todoThings) {
        std::cout << item << std::endl;
    }
    std::cout << std::endl;

    // TODO 注意: 如果list中的元素是用户自定义的类型, 那么需要用户写出关系运算符函数。
    todoThings.sort();
    for (const auto& item : todoThings) {
        std::cout << item << std::endl;
    }
    std::cout << std::endl;

    todoThings.push_back(todo4);
    for (const auto& item : todoThings) {
        std::cout << item << std::endl;
    }
    std::cout << std::endl;
    todoThings.unique();
    for (const auto& item : todoThings) {
        std::cout << item << std::endl;
    }
    std::cout << std::endl;

    std::list<Todo> list(todoThings);
    list.splice(++list.cbegin(), list, ++ ++list.cbegin());
    for (const auto& item : list) {
        std::cout << item << std::endl;
    }
    std::cout << std::endl;
    list.sort();

    todoThings.merge(list);
    for (const auto& item : todoThings) {
        std::cout << item << std::endl;
    }
    std::cout << std::endl;

    // CentOS8.2的reverse()的实现是不公开的。
    todoThings.reverse();
    for (const auto& item : todoThings) {
        std::cout << item << std::endl;
    }
    std::cout << std::endl;

    std::cout << "=============" << std::endl;
    // splice()在不同的list中的使用
    std::cout << "list.size(): " << list.size() << std::endl;
    list = todoThings;
    todoThings.splice(++todoThings.cbegin(), list, list.cbegin(), list.cend());
    for (const auto& item : todoThings) {
        std::cout << item << std::endl;
    }
    std::cout << std::endl;


    return 0;
}